
public class ArrayQueue implements Queue {
    private Object[] items;
    private int size;
    private int front;
    private int back;

    public ArrayQueue() {
	clear();
    }
    public void clear() {
	items = new Object[1];
	size = 0;
	front = 0;
	back = 0;
    }
    public boolean isEmpty() {
	return size == 0;
    }
    private void grow() {
	Object[] copy = new Object[items.length * 2];
	for (int i = 0; i < size; i++) {
	    copy[i] = items[front];
	    front++;
	    if (front >= items.length) front = 0;
	}
	items = copy;
	front = 0;
	back = size;
    }
    public void enqueue(Object x) {
	if (size >= items.length)
	    grow();
	items[back] = x;
	back++;
	if (back >= items.length) back = 0;
	size++;
    }
    public Object dequeue() {
	if (isEmpty())
	    throw new java.util.EmptyStackException();
	size--;
	Object x = items[front];
	front++;
	if (front >= items.length) front = 0;
	return x;
    }
    public Object first() {
	if (isEmpty())
	    throw new java.util.EmptyStackException();
	return items[front];
    }
}

